package cn.broadmax.boot.util;

import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class JsonUtils {

	private static ObjectMapper mapper;
	static{
		mapper = new ObjectMapper();
	}

	/**
	 * 解析json字符串为对象
	 * @param json	json字符串
	 * @param cla	对象类
	 * @param <T>	泛型对象
	 * @return	返回指定的对象
	 */
	public static <T> T parseJson(String json, Class<T> cla){
		try {
			return mapper.readValue(json, cla);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 解析字符串为集合对象
	 * @param json	json字符串
	 * @param cla	对象类
	 * @param <T>	泛型
	 * @return	返回集合对象
	 */
	public static <T> List<T> parseJsonList(String json, Class<T> cla){
		try {
			return mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, cla));
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 对象转化为字符串
	 * @param value	对象
	 * @return	json字符串
	 */
	public static String toJSONString(Object value){
		return toJSONString(value, false);
	}

	/**
	 * 对象转化为字符串
	 * @param value	对象
	 * @param pretty	是否格式化
	 * @return	json字符串
	 */
	public static String toJSONString(Object value, boolean pretty){
		try {
			if(pretty){
				return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(value);
			}
			return mapper.writeValueAsString(value);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 转换文件内容为对象
	 * @param file	文件
	 * @param cla	类
	 * @param <T>	泛型
	 * @return	泛型对象
	 */
	public static <T> T parseJson(File file, Class<T> cla){
		try {
			return mapper.readValue(file, cla);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 转换文件内容为对象集合
	 * @param file	文件
	 * @param cla	类
	 * @param <T>	泛型
	 * @return	泛型对象
	 */
	public static <T> List<T> parseJsonList(File file, Class<T> cla){
		try {
			return mapper.readValue(file, mapper.getTypeFactory().constructCollectionType(List.class, cla));
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 写入对象的json格式到文件
	 * @param value	对象
	 * @param file	文件
	 */
	public static void writerObjToFileWithJson(Object value, File file){
		writerObjToFileWithJson(value, file, false);
	}

	/**
	 * 写入对象的json格式到文件
	 * @param value	对象
	 * @param file	文件
	 * @param pretty	是否格式化
	 */
	public static void writerObjToFileWithJson(Object value, File file, boolean pretty){
		try {
			if(pretty){
				mapper.writerWithDefaultPrettyPrinter().writeValue(file, value);
			}
			else{
				mapper.writeValue(file, value);
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
	
}
